package com.baidu.erp.visitor;

import com.baidu.erp.composite.PermissionNode;
import com.baidu.erp.dao.PermissionDao;
import com.baidu.erp.dao.RolePermissionRelationDao;
import com.baidu.erp.domain.Permission;

import java.util.ArrayList;
import java.util.List;

public class CheckRolePermissionRelationVisitor implements PermissionVisitor{
    //角色权限关系
    private RolePermissionRelationDao rolePermissionRelationDao;
    //权限信息
    private PermissionDao permissionDao;
    //权限是否被占用 true表示被占用
    private Boolean status = false;

    public CheckRolePermissionRelationVisitor() { }

    public CheckRolePermissionRelationVisitor(RolePermissionRelationDao rolePermissionRelationDao, PermissionDao permissionDao) {
        this.rolePermissionRelationDao = rolePermissionRelationDao;
        this.permissionDao = permissionDao;
    }

    public CheckRolePermissionRelationVisitor(PermissionDao permissionDao, RolePermissionRelationDao rolePermissionRelationDao) {
        this.rolePermissionRelationDao = rolePermissionRelationDao;
        this.permissionDao = permissionDao;
    }

    public Boolean getStatus() { return status; }

    @Override
    public void visit(PermissionNode permissionNode) {
        List<Permission> permissionList = permissionDao.getSonPermissionById(permissionNode.getId());
        //为了不破坏 Permission 的数据结构，建立了 PermissionNode 类，用来做访问者的操作
        //将数据的类型转换为 List<PermissionNode>
        List<PermissionNode> permissionNodeList = new ArrayList<>(permissionList.size());
        permissionList.forEach(p->{
            permissionNodeList.add(p.clone(PermissionNode.class));
        });

        if (permissionNodeList != null && permissionNodeList.size()>0){
            permissionNodeList.forEach(node->node.accept(this));
        }
        //更改状态
        Boolean checkResult = checkRolePermissionRelation(permissionNode.getId());

    }

    ////更改状态
    private Boolean checkRolePermissionRelation(String permission_id) {
        //根据 权限id 查询数据库 角色权限关系表 中有没有角色占用权限
        Long count = rolePermissionRelationDao.getCountByPermissionId(permission_id);
        if (count != null && count>0){
            this.status = true;
            return true;
        }
        return false;
    }
}
